package com.tjetc.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 切面类: 切入点和通知方法
 *
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/9/2
 */
// 1. 切面类得需要被Spring管理
// 2. 需要告诉Spring是一个切面类
@Aspect
@Component

// 默认是最低优先级 如果有多个切面时 需要我们自己来定义优先级
@Order(0)
public class MyAspectJ {


    // 该方法什么都没有只是用来切点表达式的抽取
    @Pointcut("execution(* *..*.*(..))")
    public void pc() {
    }


//    @Pointcut("execution()")
//    public void pc1(){}

    // 前置通知
    // 注解中的属性如果没有default 就需要我们必须写
    // 参数指的是要给哪个方法进行通知 要自己写切点表达式
//    @Before("execution(public void com.tjetc.aop.Car.run())")
//    @Before("execution(* *..*.*(..))")
//    @Before("pc()")
//    public void showLogBefore(JoinPoint joinPoint) {
//        System.out.println("前置通知");
//    }

    /*
        切点表达式练习：
        1.public int xx.xx.jj.*(..)
        2.* xx.xx.jj.*(String..)
        3.* *..*.*()
        4.* com..*.*(..int)
        5.private int xx.xx.Service*.*()

     */

    //    @After("execution(* *..*.*(..))")
//    @After("pc()")
//    public void showLogAfter() {
//        System.out.println("后置通知");
//    }


//    @AfterReturning(value = "pc()", returning = "res")
//    public void showLogAfterReturning(Object res) {
//        System.out.println("返回通知");
//        System.out.println(res);
//    }


//    @AfterThrowing(value = "pc()", throwing = "e")
//    public void showLogThrowing(Throwable e) {
//        System.out.println("异常通知");
//        System.out.println(e.getMessage());
//    }


    @Around("pc()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object result = null;
        try {
            System.out.println("前置通知");
            result = joinPoint.proceed();
            System.out.println("返回通知" + result);
        } catch (Throwable e) {
            System.out.println("异常通知");
        } finally {
            System.out.println("后置通知");
        }
        return result;
    }


}